package main

import (
	"fmt"
	"strconv"
)

//func main方法也是一个函数
func main() {
	fmt.Println("examp14")
	func1()                                     //函数调用
	s := func2(1, 2, "a", "b", "c", 1, 2, 3, 4) //调用函数并接收
	fmt.Println(s)
	s2, s3 := func3(2, 4) //(float64, string) 多返回值接收
	fmt.Println("多返回值", s2, s3)
	s4, _ := func3(4, 5) //使用下划线忽略返回值,返回值顺序是对应的
	fmt.Println("忽略一个返回值", s4)
	func5 := func4(2) //闭包的调用
	s5 := func5(4)    //返回函数调用
	fmt.Println(s5)
	//匿名函数
	nmFunc := func() int {
		fmt.Println("匿名函数")
		return 1 + 2
	}
	s6 := nmFunc()
	fmt.Println("匿名函数返回值", s6)
	func() {
		fmt.Println("匿名函数的直接调用")
	}()
}

//定义一个函数
func func1() {
	fmt.Println("定义一个函数")
}

//多参数,相同类型的参数可以简写,变长参数(数组)
//带有返回值，一个返回值不需要加括号
func func2(a int, b int, c, d, e string, f ...int) int {
	fmt.Println("参数", a, b)
	fmt.Println("参数简写", c, d, e)
	fmt.Println("变长参数", f)
	return a + b
}

//多返回值,需要加上括号，并用逗号分格
func func3(a int, b int) (float64, string) {
	return float64(a + b), strconv.Itoa(a) + strconv.Itoa(b)
}

//闭包，相当于返回参数是函数，能过返函数再去执行里面的代码
func func4(x int) func(y int) int {
	return func(y int) int {
		return x + y
	}
}

//不支持重载
func fload1(x int) {

}

//不同参数类型重载，编译报错
//func fload1(x string) {

//}
